from turtle import shape
import taichi as ti

ti.init(arch=ti.cuda)

#root 挂载 列表list  list可嵌套 
# list下可以挂指针指向cell  若cell空 则释放这部分cell内存
# 若cell有数据 则挂载带有定义好结构的cell
# 常用于稀疏矩阵 
a = ti.field(ti.f32, shape=(3, 4))
x = ti.field(ti.f32)

ti.root.pointer(ti.ij, (3, 4)).place(x)
ti.root.pointer(ti.i, 3).pointer(ti.j,4).place(x)
# 可以使用bitmasked来代替指针定义
# 可以保证数据进入GPU是64bit成块的 且在访问时跳过无数据的单元
ti.root.pointer(ti.i, 3).bitmasked(ti.j,4).place(x)


block = ti.root.pointer(ti.i,3)
# is_active 可查看数据结构里的节点的状态是否激活
ti.is_active(block,[0])
#  激活数据结构里的某个节点
ti.activate(block,[0])
#  将数据结构里的某个激活节点失活
ti.deactivate(block,[1])
# deactivate_all失活节点下的所有数据内存
block.deactivate_all()
# rescale_index 可查看父节点或上级节点的index
ti.rescale_index(block,[1])


@ti.kernel
def foo():
    print('a=', a[None])


a[None] = 43
foo()
a[None] = 55
foo()